package com.ark.cloud.dataservices.common.web.entity;

import com.ark.cloud.dataservices.common.exception.BaseException;
import com.ark.cloud.dataservices.common.exception.ErrorType;
import com.ark.cloud.dataservices.common.exception.SystemErrorType;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
public class Result<T> {

    public static final Integer SUCCESSFUL_CODE = 20000;
    public static final String SUCCESSFUL_MESG = "处理成功";

    /**
     * 处理结果code
     */
    private Integer code;
    /**
     * 处理结果描述信息
     */
    private String message;
    /**
     * 请求结果生成时间戳
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss:SSS", timezone = "GMT+8")
    private final LocalDateTime timestamp;
    /**
     * 处理结果数据信息
     */
    private T data;

    public Result() {
        this.timestamp = LocalDateTime.now();
    }

    /**
     * @param errorType 异常类型
     */
    public Result(ErrorType errorType) {
        this.code = Integer.parseInt(errorType.getCode());
        this.message = errorType.getMesg();
        this.timestamp = LocalDateTime.now();
    }

    private Result(int code, String message) {
        this.code = code;
        this.message = message;
        this.timestamp = LocalDateTime.now();
    }

    /**
     * @param errorType 异常类型
     * @param data      结果数据
     */
    public Result(ErrorType errorType, T data) {
        this(errorType);
        this.data = data;
    }

    /**
     * 内部使用，用于构造成功的结果
     *
     * @param code    状态码
     * @param message 结果消息
     * @param data    数据
     */
    private Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = LocalDateTime.now();
    }

    /**
     * 快速创建成功结果并返回结果数据
     *
     * @param data 结果数据
     * @return Result
     */
    public static Result<?> success(Object data) {
        return new Result<>(SUCCESSFUL_CODE, SUCCESSFUL_MESG, data);
    }

    /**
     * 快速创建成功结果
     *
     * @return Result
     */
    public static Result<?> success() {
        return success(null);
    }

    /**
     * 系统异常类没有返回数据
     *
     * @return Result
     */
    public static Result<?> fail() {
        return new Result<>(SystemErrorType.SYSTEM_ERROR);
    }

    public static Result<?> fail(int code, String message) {
        return new Result<>(code, message);
    }

    /**
     * 系统异常类没有返回数据
     *
     * @param baseException 异常
     * @return Result
     */
    public static Result<?> fail(BaseException baseException) {
        return fail(baseException, null);
    }

    /**
     * 系统异常类并返回结果数据
     *
     * @param data 结果数据
     * @return Result
     */
    public static Result<?> fail(BaseException baseException, Object data) {
        return new Result<>(baseException.getErrorType(), data);
    }

    /**
     * 系统异常类并返回结果数据
     *
     * @param errorType 异常类型
     * @param data      结果数据
     * @return Result
     */
    public static Result<?> fail(ErrorType errorType, Object data) {
        return new Result<>(errorType, data);
    }

    /**
     * 系统异常类并返回结果数据
     *
     * @param errorType {@link ErrorType}
     * @return Result
     */
    public static Result<?> fail(ErrorType errorType) {
        return Result.fail(errorType, null);
    }

    /**
     * 系统异常类并返回结果数据
     *
     * @param data 结果数据
     * @return {@link Result}
     */
    public static Result<?> fail(Object data) {
        return new Result<>(SystemErrorType.SYSTEM_ERROR, data);
    }


    /**
     * 成功code=200
     *
     * @return true/false
     */
    @JsonIgnore
    public boolean isSuccess() {
        return SUCCESSFUL_CODE.equals(this.code);
    }

    /**
     * 失败
     *
     * @return true/false
     */
    @JsonIgnore
    public boolean isFail() {
        return !isSuccess();
    }
}
